perm filename BNCH11.PL[PLC,LSP] blob
sn#763180 filedate 1984-08-03 generic text, type T, neo UTF8
% [17] **** Reversible functions ****
:- public fact/2, fib/2, sum/3, prod/3.
:- public q171/1, solve/1.
/*
To optimize the compiled code, add the next declarations:
:- mode q171(-), solve(1).
:- fastcode.
:- compactcode.
*/
sum(X,0,X).
sum(X,s(Y),s(Z)) :- sum(X,Y,Z).
prod(X,0,0).
prod(X,s(Y),Z) :- prod(X,Y,W), sum(W,X,Z).
fact(0,s(0)).
fact(s(X),Z) :- fact(X,Y), prod(s(X),Y,Z).
fib(0,s(0)).
fib(s(0),s(0)).
fib(s(s(N)),V) :- fib(s(N),X), fib(N,Y), sum(X,Y,V).
solve(Y) :- fib(X,s(s(s(s(s(s(s(s(s(s(s(s(s(0)))))))))))))),
fact(X,Y).
/*
[17-1:] Calculate fact(fib*(13)) where fib* is the reverse funcition of fib.
do "q171(10)." for ten iterations.
*/
q171(N) :-
statistics(garbage←collection,[←,←|G1]),!,
statistics(runtime,[←,←]),!,
loop←q171(0,N),
statistics(runtime,[←,T1]),!,
statistics(garbage←collection,[←,←|G2]),!,
statistics(runtime,[←,←]),!,
loop←dummy(0,N),
statistics(runtime,[←,T2]),
statistics(garbage←collection,[←,←|G3]),!,
G1 = [Gt1], G2 = [Gt2], G3 = [Gt3],
G4 is Gt2 + Gt2 - Gt1 - Gt3,
T3 is T1-T2-G4, Total is T1-T2,
write('Total = '), write(Total),
write('ms, runtime = '), write(T3),
write('ms, gctime = '), write(G4),
write('ms, for '), write(N), write(' iterations.'), nl.
loop←q171(N,N) :- !.
loop←q171(I,N) :-
I1 is I+1, solve(Y), !, loop←q171(I1,N).
loop←dummy(N,N) :- !.
loop←dummy(I,N) :-
I1 is I+1, !, loop←dummy(I1,N).